package com.swak.utils;

public class Doubles {

	/**
	 * 变负数
	 * 
	 * @param value
	 * @return
	 */
	public static double negate(double value) {
		return -value;
	}

	/**
	 * nullToZero
	 *
	 * @param value 数据
	 * @return 整数
	 */
	public static double nullToZero(Double value) {
		return value == null ? 0.0 : value;
	}

	/**
	 * 整形的添加
	 *
	 * @param values 多个数据
	 * @return 结果
	 */
	public static double addI(Double... values) {
		double num = 0;
		if (values != null && values.length != 0) {
			for (Double value : values) {
				num = BigDecimalUtils.add(num, nullToZero(value));
			}
		}
		return num;
	}

	/**
	 * 整形的减法
	 *
	 * @param minuend 被减数
	 * @param subs    减数
	 * @return 结果
	 */
	public static double subI(Double minuend, Double... subs) {
		if (subs != null && subs.length != 0) {
			for (Double value : subs) {
				minuend = BigDecimalUtils.sub(nullToZero(minuend), nullToZero(value));
			}
		}
		return nullToZero(minuend);
	}

	/**
	 * 乘法
	 * 
	 * @param minuend
	 * @param subs
	 * @return
	 */
	public static double mulI(Double minuend, Double... subs) {
		if (subs != null && subs.length != 0) {
			for (Double value : subs) {
				minuend = BigDecimalUtils.mul(nullToZero(minuend), nullToZero(value));
			}
		}
		return nullToZero(minuend);
	}

	/**
	 * 除法
	 * 
	 * @param dividend
	 * @param divs
	 * @return
	 */
	public static double divI(Double dividend, Double... divs) {
		if (divs != null && divs.length != 0) {
			for (Double value : divs) {
				dividend = BigDecimalUtils.div(nullToZero(dividend), nullToZero(value));
			}
		}
		return nullToZero(dividend);
	}

	/**
	 * 最小值
	 *
	 * @param one 数据1
	 * @param two 数据2
	 * @return 最小值
	 */
	public static double min(double one, double two) {
		return Math.min(one, two);
	}

	/**
	 * 最大值
	 *
	 * @param one 数据1
	 * @param two 数据2
	 * @return 最大值
	 */
	public static double max(double one, double two) {
		return Math.max(one, two);
	}

	/**
	 * middle 如果不在 [lower, upper], 则取两端
	 * 
	 * @param lower
	 * @param middle
	 * @param upper
	 * @return
	 */
	public static double bound(double lower, double middle, double upper) {
		return Math.min(Math.max(lower, middle), upper);
	}
}